package com.algorithm.liyc.echa;

import com.algorithm.liyc.entity.TreeNode;

/**
 * 0700.二叉搜索树中的搜索
 * 给定二叉搜索树（BST）的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在，则返回 NULL。
 *
 * 二叉搜索树是一个有序树：
 * ● 若它的左子树不空，则左子树上所有结点的值均小于它的根结点的值；
 * ● 若它的右子树不空，则右子树上所有结点的值均大于它的根结点的值；
 * ● 它的左、右子树也分别为二叉搜索树
 * 这就决定了，二叉搜索树，递归遍历和迭代遍历和普通二叉树都不一样。
 *
 * @author Liyc
 * @date 2024/1/11 14:33
 **/

public class Solution17 {
    /**
     * 递归
     * @param root
     * @param val
     * @return
     */
    public TreeNode searchBST1(TreeNode root, int val) {
        if (root == null || root.val == val) return root;

        TreeNode result = new TreeNode(0);
        if (root.val > val) {
            result = searchBST1(root.left, val);
        }
        if (root.val < val) {
            result = searchBST1(root.right, val);
        }
        return result;
    }

    /**
     * 迭代
     * @param root
     * @param val
     * @return
     */
    public TreeNode searchBST2(TreeNode root, int val) {
        if (root == null || root.val == val) return root;
        while (root != null) {
            if (root.val == val) {
                return root;
            }
            if (root.val < val) {
                root = root.left;
            }
            if (root.val > val) {
                root = root.right;
            }
        }
        return null;
    }
}
